"use strict";
(function () {

    /*****************************类的说明*****************************/



    /**************************经典式继承******************************/
    // 继承实例
    // 父类
    function SuperType1() {
        this.name = "继承自SuperType1实例（经典式继承）";
        this.sayName = function name(params) {
            alert(this.name);
        };
    };
    // 子类
    function SubType1() {
        SuperType1.call(this);
    };
    var sub1 = new SubType1;
    // 经典式继承绑定事件
    document.getElementById("extend1").onclick = function () {
        sub1.sayName();
    };

    /**************************寄生式继承******************************/
    // 寄生
    function inheritPrototype(SubType,SuperType) {
        // 克隆
        var prototype = Object.create(SuperType.prototype);
        // 拓展
        prototype.constructor = SubType;
        // 赋值
        SubType.prototype = prototype;
        SubType.prototype.uber = SuperType.prototype;
    };
    function SuperType2() {
        this.name = "SuperType2";
    };
    // 父类
    SuperType2.prototype.sayName = function () {
        alert(this.name); // 无法获取实例
        alert("无法获取实例,能调用原型。")
    };
    // 子类
    function SubType2() {};
    // 继承
    inheritPrototype(SubType2,SuperType2);
    var sub2 = new SubType2;
    document.getElementById("extend2").onclick = function () {
        sub2.sayName();
    };

    /************************寄生混合式继承****************************/
    // 父类
    function SuperType3() {
        this.nameSuperType = "实例";
    };
    SuperType3.prototype.sayNameSuperType = function () {
        alert("父类（寄生混合式继承）");
    };
    // 子类
    function SubType3() {
        // 继承实例
        SuperType3.call(this);
        this.nameSubType= "subType3";
    };
    // 继承
    inheritPrototype(SubType3,SuperType3);
    // 继承原型之后增加基类原型
    SubType3.prototype.sayNameSubType = function () {
        this.sayNameSuperType();
        console.log(this.constructor,`this指向基类`);
        this.uber.sayNameSuperType();
        console.log(this.uber.constructor,`super指向父类`);
    };
    SubType3.prototype.sayNameSuperType = function () {
        alert("基类（寄生混合式继承）");
    };
    var sub3 = new SubType3;
    // 寄生混合式继承绑定事件
    document.getElementById("extend3").onclick = function () {
        sub3.sayNameSubType();
    };

    /****************************ES6继承*******************************/
    class SuperType4{
        constructor(name){
            this.name = name;
        }
        sayName(){
            alert(this.name);
        }
    }
    SuperType4.prototype.age = 1; // ES6不能在原型上定义变量。

    // extends代表寄生，继承原型。
    class SubType4 extends SuperType4{
        constructor() {
            // super代表ES5的经典式继承，继承实例。不声明super没法使用this。
            super("父类（ES6继承）");
            this.nameChange = `基类（ES6继承）`;
        }
        sayName(){
            alert(this.nameChange);
        }
        say() {
            this.sayName();
            console.log(this.constructor,`this指向基类`);
            super.sayName();
            console.log(super.constructor,`super指向父类`);
        }
    }
    const sub4 = new SubType4();
    document.getElementById("extend4").onclick = () => {
        sub4.say();
    };

    // 混合（这里不做介绍）
    // 继承多个
}());
